home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / Pascal / Snippets / PNL Libraries / MyStrh.p < prev    next >
Text File  |  1997-03-21  |  8KB  |  349 lines

  1. unit MyStrH;
  2.  
  3. interface
  4.  
  5.     uses
  6.         Types,
  7.         MyAssertions;
  8.  
  9.     type
  10.         lineIndex = integer;
  11.  
  12.     const
  13.         first_strh_offset = SizeOf(lineIndex);
  14.  
  15.     type
  16.         indexPtr = ^lineIndex;
  17.         StrHHandle = ^indexPtr;
  18.  
  19. {$ifc not do_debug}
  20. {$definec AssertValidStrH(data)}
  21. {$elsec}
  22. {$definec AssertValidStrH(data) AssertValidStrHCode(data)}
  23. {$endc}
  24.  
  25.     procedure AssertValidStrHCode( data: StrHHandle );
  26.  
  27.     function ValidStringH ( data: StrHHandle ): boolean;
  28.  
  29.     function NewStrH: StrHHandle;
  30.     function MNewStrH( var sh: StrHHandle): OSErr;
  31.     function MGetStrH ( resfile: integer; id: integer; var data: StrHHandle ): OSErr;
  32.  
  33.     procedure MDisposeStrH ( var data: StrHHandle );
  34.     procedure ReleaseStrH ( data: StrHHandle );
  35.  
  36.     procedure ResetStrH ( data: StrHHandle );
  37.     function CountStrH ( data: StrHHandle ): integer;
  38.  
  39.     function CountStrs ( id: integer ): lineIndex;
  40.     function GetIndStr ( id: integer; index: lineIndex ): Str255;
  41.  
  42.     function GetIndStrH ( data: StrHHandle; index: lineIndex ): Str255;
  43.     function GetNextStrH ( data: StrHHandle; var offset: longint ): Str255;
  44.     function SetIndStrH ( data: StrHHandle; index: lineIndex; const s: Str255 ): OSErr;
  45.     function AppendStrH ( data: StrHHandle; const s: Str255 ): OSErr;
  46.     procedure DelIndStrH ( data: StrHHandle; index: integer );
  47.     function InsIndStrH ( data: StrHHandle; index: integer; const s: Str255 ): OSErr;
  48.  
  49. implementation
  50.  
  51.     uses
  52.         Memory, Resources, ToolUtils, TextUtils,
  53.         MyMemory, MyAssertions, MyResources, MyLowLevel;
  54.  
  55.     procedure AssertValidStrHCode( data: StrHHandle );
  56.     begin
  57.         if CheckHandle( Handle(data) ) then begin
  58.             Assert( ValidStringH( data ) );
  59.         end;
  60.     end;
  61.     
  62.     function NewStrH: StrHHandle;
  63.     begin
  64.         NewStrH := StrHHandle(NewHandleClear(SizeOf(lineIndex)));
  65.     end;
  66.  
  67.     function MNewStrH( var sh: StrHHandle): OSErr;
  68.     begin
  69.         sh := StrHHandle(NewHandleClear(SizeOf(lineIndex)));
  70.         MNewStrH := MemError;
  71.     end;
  72.  
  73.     function MGetStrH ( resfile: integer; id: integer; var data: StrHHandle ): OSErr;
  74.         var
  75.             err: OSErr;
  76.     begin
  77.         err := MGetResource( resfile,  'STR#', id, data );
  78.         if err = noErr then begin
  79.             HNoPurge( Handle(data) );
  80.             AssertValidStrH( data );
  81.         end;
  82.         MGetStrH := err;
  83.     end;
  84.  
  85.     procedure MDisposeStrH ( var data: StrHHandle );
  86.     begin
  87.         if data <> nil then begin
  88.             AssertValidStrH( data );
  89.             MDisposeHandle( data );
  90.         end;
  91.     end;
  92.  
  93.     procedure ReleaseStrH ( data: StrHHandle );
  94.     begin
  95.         AssertValidStrH( data );
  96.         ReleaseResource( Handle(data) );
  97.     end;
  98.  
  99.     procedure ResetStrH ( data: StrHHandle );
  100.     begin
  101.         AssertValidStrH( data );
  102.         MShrinkHandleSize( data, SizeOf(lineIndex) );
  103.         data^^ := 0;
  104.         AssertValidStrH( data );
  105.     end;
  106.  
  107.     function CountStrH ( data: StrHHandle ): integer;
  108.     begin
  109.         AssertValidStrH( data );
  110.         CountStrH := data^^;
  111.     end;
  112.  
  113.     function CountStrs ( id: integer ): lineIndex;
  114.         var
  115.             data: StrHHandle;
  116.     begin
  117.         data := StrHHandle( GetResource( 'STR#', id )) ;
  118.         AssertValidStrH( data );
  119.         if data <> nil then begin
  120.             CountStrs := data^^;
  121.         end else begin
  122.             CountStrs := 0;
  123.         end;
  124.     end;
  125.  
  126.     function GetIndStr ( id: integer; index: lineIndex ): Str255;
  127.         var
  128.             s: Str255;
  129.     begin
  130.         Assert( index > 0 );
  131.         GetIndString( s, id, index );
  132.         GetIndStr := s;
  133.     end;
  134.  
  135.     function ValidStringH ( data: StrHHandle ): boolean;
  136.         var
  137.             count, i: lineIndex;
  138.             ps: longint;
  139.             size: longint;
  140.     begin
  141.         ValidStringH := false;
  142.         if (data <> nil) then begin
  143.             size := MGetHandleSize( Handle(data) );
  144.             if (size >= SizeOf(lineIndex)) & (MemError = noErr) then begin
  145.                 count := data^^;
  146.                 ps := SizeOf(lineIndex);
  147.                 for i := 1 to count do begin
  148.                     ps := ps + GetUnsignedByte( data^, ps ) + 1;
  149.                     if ps > size then begin
  150.                         leave;
  151.                     end;
  152.                 end;
  153.                 ValidStringH := size = ps;
  154.             end;
  155.         end;
  156.     end;
  157.  
  158.     function StrHIndexToOffset( data: StrHHandle; index: lineIndex ): longint;
  159.         var
  160.             count, i: lineIndex;
  161.             ps: longint;
  162.     begin
  163.         AssertValidStrH( data );
  164.         Assert( index > 0 );
  165.         count := data^^;
  166.         if (1 <= index) and (index <= count) then begin
  167.             ps := SizeOf(lineIndex);
  168.             for i := 1 to index - 1 do begin
  169.                 ps := ps + GetUnsignedByte( data^, ps ) + 1;
  170.             end;
  171.         end else begin
  172.             ps := MGetHandleSize(Handle(data));
  173.         end;
  174.         StrHIndexToOffset := ps;
  175.         AssertValidStrH( data );
  176.     end;
  177.     
  178.     function GetIndStrH ( data: StrHHandle; index: lineIndex ): Str255;
  179.         var
  180.             s: Str255;
  181.             ps: longint;
  182.     begin
  183.         AssertValidStrH( data );
  184.         Assert( index > 0 );
  185.         ps := StrHIndexToOffset( data, index );
  186.         if ps < MGetHandleSize( Handle(data) ) then begin
  187.             BlockMoveData( AddPtrLong( data^, ps ), @s, GetUnsignedByte( data^, ps ) + 1);
  188.         end else begin
  189.             s := '';
  190.         end;
  191.         GetIndStrH := s;
  192.         AssertValidStrH( data );
  193.     end;
  194.  
  195.     function GetNextStrH ( data: StrHHandle; var offset: longint ): Str255;
  196.         var
  197.             s: Str255;
  198.             len: integer;
  199.     begin
  200.         AssertValidStrH( data );
  201.         if offset >= MGetHandleSize( Handle(data) ) then begin
  202.             s := '';
  203.         end else begin
  204.             len := GetUnsignedByte( data^, offset ) + 1;
  205.             BlockMoveData( AddPtrLong( data^, offset ), @s, len );
  206.             offset := offset + len;
  207.         end;
  208.         GetNextStrH := s;
  209.         AssertValidStrH( data );
  210.     end;
  211.  
  212.     function SetIndStrH ( data: StrHHandle; index: lineIndex; const s: Str255 ): OSErr;
  213.         var
  214.             err: OSErr;
  215.             count: lineIndex;
  216.             size: longint;
  217.             pos: longint;
  218.             ps: longint;
  219.     begin
  220.         AssertValidStrH( data );
  221.         Assert( index > 0 );
  222.         err := noErr;
  223.         count := data^^;
  224.         size := MGetHandleSize( Handle(data) );
  225.         if count < index then begin
  226.             err := MGrowHandleSize( Handle(data), size + index - count );
  227.             if err = noErr then begin
  228.                 MZero( AddPtrLong( data^, size ), index - count );
  229.                 ps := size + index - count - 1;
  230.                 data^^ := index;
  231.                 count := index;
  232.             end;
  233.         end else begin
  234.             ps := StrHIndexToOffset( data, index );
  235.         end;
  236.         if err = noErr then begin
  237.             pos := Munger( Handle(data), ps, nil, GetUnsignedByte( data^, ps ) + 1, @s, length(s) + 1 );
  238.             err := MemError;
  239.         end;
  240.         SetIndStrH := err;
  241.         AssertValidStrH( data );
  242.     end;
  243.  
  244.     function AppendStrH ( data: StrHHandle; const s: Str255 ): OSErr;
  245.         var
  246.             err: OSErr;
  247.     begin
  248.         AssertValidStrH( data );
  249.         err := PtrAndHand( @s, Handle(data), length(s) + 1);
  250.         if err = noErr then begin
  251.             Inc(data^^);
  252.         end;
  253.         AppendStrH := err;
  254.         AssertValidStrH( data );
  255.     end;
  256.  
  257.     procedure DelIndStrH ( data: StrHHandle; index: integer );
  258.         var
  259.             count: lineIndex;
  260.             size: longint;
  261.             ps: longint;
  262.     begin
  263.         AssertValidStrH( data );
  264.         Assert( index > 0 );
  265.         count := data^^;
  266.         size := MGetHandleSize( Handle(data) );
  267.         if index <= count then begin
  268.             ps := StrHIndexToOffset( data, index );
  269.             MMungerDelete( Handle(data), ps, GetUnsignedByte( data^, ps ) + 1 );
  270.             data^^ := count - 1;
  271.         end;
  272.         AssertValidStrH( data );
  273.     end;
  274.  
  275.     function InsIndStrH ( data: StrHHandle; index: integer; const s: Str255 ): OSErr;
  276.         var
  277.             err: OSErr;
  278.             count: lineIndex;
  279.             ps: longint;
  280.             t: string[2];
  281.     begin
  282.         err := noErr;
  283.         AssertValidStrH( data );
  284.         Assert( index > 0 );
  285.         count := data^^;
  286.         if index <= count then begin
  287.             ps := StrHIndexToOffset( data, index );
  288.             t := '';
  289.             err := MMungerInsert( Handle(data), ps, @t, length(t) + 1 );
  290.             if err = noErr then begin
  291.                 data^^ := count + 1;
  292.             end;
  293.         end;
  294.         if err = noErr then begin
  295.             err := SetIndStrH(data, index, s);
  296.         end;
  297.         InsIndStrH := err;
  298.         AssertValidStrH( data );
  299.     end;
  300.  
  301. end.
  302.     procedure DisposeStrH ( data: StrHHandle );
  303.     begin
  304.         if data <> nil then begin
  305.             AssertValidStrH( data );
  306.             MDisposeHandle( data );
  307.         end;
  308.     end;
  309.  
  310.     procedure SetIndStr (id, index: lineIndex; const s: Str255);
  311.         var
  312.             data: StrHHandle;
  313.     begin
  314.         data := StrHHandle( GetResource('STR#', id) );
  315.         AssertValidStrH( data );
  316.         HNoPurge(Handle(data));
  317.         SetIndStrH(data, index, s);
  318.         HPurge(Handle(data));
  319.         ChangedResource(Handle(data));
  320.         WriteResource(Handle(data));
  321.     end;
  322.  
  323.     procedure DelIndStr (id: integer; index: lineIndex);
  324.         var
  325.             data: StrHHandle;
  326.     begin
  327.         data := StrHHandle(GetResource('STR#', id));
  328.         Assert( data <> nil );
  329.         HNoPurge(Handle(data));
  330.         DelIndStrH(data, index);
  331.         HPurge(Handle(data));
  332.         ChangedResource(Handle(data));
  333.         WriteResource(Handle(data));
  334.     end;
  335.  
  336.     procedure InsIndString (id: integer; index: lineIndex; const s: Str255);
  337.         var
  338.             data: StrHHandle;
  339.     begin
  340.         data := StrHHandle(GetResource('STR#', id));
  341.         Assert( data <> nil );
  342.         HNoPurge(Handle(data));
  343.         InsIndStrH(data, index, s);
  344.         HPurge(Handle(data));
  345.         ChangedResource(Handle(data));
  346.         WriteResource(Handle(data));
  347.     end;
  348.  
  349.